<?php

class ocorrenciasSecurity extends osecurity implements ocorrencia_security{
    
    protected $permissions = array(
        'UserIsAdmin'               => 'CRUD',
        'SuperiorHierarquico'       => 'RU',
        'PertenceAoGrupo'           => 'CR'
    );
    
    private $menu = array(
        'group'=> array('link' => 'ocorrencia/ocorrencias/group/', 'cod' => true, 'permission' => 'R', 'name' => 'Voltar ao grupo', 'isoption' => false),
        'formulario'=> array('link' => 'ocorrencia/ocorrencias/formulario/', 'cod' => false, 'permission' => 'C', 'name' => 'Inserir Assunto', 'isoption' => false),
        'show'=> array('link' => 'ocorrencia/ocorrencias/show/', 'cod' => true, 'permission' => 'R', 'name' => 'Voltar para o Assunto', 'isoption' => false),
        'pessoas' => array('link' => 'ocorrencia/ocorrencias/pessoas/', 'cod' => true, 'permission' => 'U', 'name' => 'Pessoas no Assunto', 'isoption' => true),
        'editar'=> array('link' => 'ocorrencia/ocorrencias/editar/', 'cod' => true, 'permission' => 'U', 'name' => 'Editar Assunto', 'isoption' => true),
        'files' => array('link' => 'ocorrencia/ocorrencias/files/', 'cod' => true, 'permission' => 'R', 'name' => 'Visualizar Arquivos', 'isoption' => true),
        'excluir' => array('link' => 'ocorrencia/ocorrencias/excluir/', 'cod' => true, 'permission' => 'D', 'name' => 'Excluir Assunto', 'isoption' => true),
        'novamsg' => array('link' => '#ocorrencia_ocorrencias_show_form','cod' => false, 'permission' => 'R', 'name' => 'Nova Mensagem', 'isoption' => false),
        'reativar' => array('link' => 'ocorrencia/ocorrencias/reativar/','cod' => true, 'permission' => 'D', 'name' => 'Restaurar Assunto', 'isoption' => true),
        //'follow' => array('link' => 'ocorrencia/ocorrencias/seguir/','cod' => true, 'permission' => 'D', 'name' => 'Seguir', 'isoption' => false),
        'novamensagem' => array('cod' => true, 'permission' => 'R', 'isoption' => false),
    );
    
    public function has_permission($cod = "", $getPerm = false){
        $action = CURRENT_ACTION;
        if(!array_key_exists($action, $this->menu)) {
            if($getPerm) return "R";
            return true;
        }
        
        //se ação não foi registrada então usuário pode executar a ação
        if($this->UserIsAdmin()){
            if($getPerm) return "CRUD";
            return true;
        }

        //se ação necessita de um código
        if($this->menu[$action]['cod'] == true){
            //se código não foi definido
            if($cod == ""){
                if($getPerm) return "";
                return false;
            }

            //verifica a permissao de administrador
            $this->LoadModel('ocorrencia/ocorrencias', 'oc');
            $needed = $this->menu[$action]['permission'];
            if($this->oc->has_permission($cod, true)){
                if($getPerm) return "CRUD";
                return true;
            }elseif($this->oc->has_permission($cod, false)){
                if($getPerm) return "CR";
                if($needed == "U" || $needed == "D")return false;
                return true;
            }

            //verifica a permissao de leitura e escrita
            if($this->oc->has_permission($cod)){
                if($getPerm) return "CR";
                return true;
            }
        }
        
        //se a ação não depende de um código
        else{
            if(isset($_SESSION['ocorrencia/grupo']) && $_SESSION['ocorrencia/grupo'] != ''){
                if($this->SuperiorHierarquico($_SESSION['ocorrencia/grupo'])){
                    if($getPerm) return "CRUD";
                    return true;
                }elseif($this->PertenceAoGrupo($_SESSION['ocorrencia/grupo'])){
                    if($getPerm) return "RU";
                    if(CURRENT_ACTION == "formulario") return false;
                    return true;
                }
            }
        }
        //retorna se usuário pode ou não executar a ação
        $permissons = $this->perm($cod);
        if($getPerm) return $permissons;
        
        if(strstr($permissons, $this->menu[$action]['permission']) === false) return false;
        return true;
    }
    
    public function getMenu($cod = ""){
        
        if($cod != ""){
            $this->LoadModel('ocorrencia/ocorrencias', 'oc');
            $item = $this->oc->getItem($cod);
            if(!empty ($item)){
                if($item['tipo'] == "Excluído"){
                    if(!OCORRENCIA_APAGAR_LIXEIRA) unset($this->menu['excluir']);
                    else $this->menu['excluir']['name'] = "Excluir Definitivamente";
                }
                else unset($this->menu['reativar']);
                
                $this->LoadModel('ocorrencia/grupo', 'gr');
                if($this->gr->IsArquivado($item['__grupo'])){
                    unset($this->menu['novamsg']);
                    unset($this->menu['pessoas']);
                }
            }
        }

        if(CURRENT_ACTION != "show"){
            unset($this->menu['novamsg']);
        }
        
        $this->LoadModel('ocorrencia/mensagem', 'msg');
        $qtd = $this->msg->getCount("cod_ocorrencia = '$cod'");
        if($qtd > 0){
            unset($this->menu['excluir']);
        }
        
        unset($this->menu['formulario']);
        $permissions = $this->perm($cod);

        $out = $option = array();
        foreach($this->menu as $arr){

            //retira as ações que são apenas de segurança mas que não são de acesso
            if(!array_key_exists('name', $arr) || !array_key_exists('link', $arr)) continue;
            
            //retira do menu os itens que apontam para a página atual
            if(CURRENT_PAGE == $arr['link'] || CURRENT_PAGE.$cod == $arr['link']) continue;
            
            //retira os itens dos quais o usuário não tem permissão de acessar
            if(strstr($permissions, $arr['permission']) === false) continue;
            
            //retira os links que demandam um código
            if($cod == "" && $arr['cod'] == true) continue;
            
            //adiciona o código ao link
            elseif($arr['cod']) $arr['link'].= $cod;
            
            //salva o link
            if($arr['isoption']) $option[$arr['name']] = $arr['link']; 
            else $out[$arr['name']] = $arr['link'];
        }
        if(!empty ($option)) $out['Opções'] = $option;
        parent::addMenu('body-top', $out);        
    }
    
    private $perm = array();
    private function perm($cod){
        if(isset($this->perm[$cod])) return $this->perm[$cod];
        $permissions = "";
        $this->LoadModel('ocorrencia/ocorrencias', 'oc');
        if(!$this->UserIsAdmin()){
            if(isset($_SESSION['ocorrencia/grupo']) && $this->SuperiorHierarquico($_SESSION['ocorrencia/grupo'])) $permissions = "CRUD";
            elseif($this->ResponsavelPorOcorrencia($cod)) $permissions = "CRUD";
            elseif($this->oc->has_permission($cod)) $permissions = "CR";
        }else $permissions = "CRUD";
        $this->perm[$cod] = $permissions;
        return $permissions;
    }
    
}

?>